לאחר שיצרתם מערכת הרשמה במדריכים הקודמים, רוצים לדעת ליצור מערכת התחברות עם Cookies, ולשלוף נתונים מהמסד?
הכל כאן!
כעת, ניצור מערכת התחברות, הקולטת נתונים מהמסד ומזהה התחברות נכונה;
ובנוסף נשתמש עם Cookie, לשמירת וזכירת ההתחברות.
בקונטרולר(Controller) בשם Account, אנחנו יצרנו במדריכים הקודמים את Register, שהוא בעצם עמוד ההרשמה:
protected/controllers/AccountController.php
<?php
class AccountController extends CController
{
public $layout = 'header';
public function actionRegister()
{
$model = new RegisterForm();
if(isset($_POST['RegisterForm']))
{
$model->attributes = $_POST['RegisterForm'];
if($model->validate())
{
print 'Work!';
}
}
$this->render('register',array('model'=>$model));
}
}
?>
class AccountController extends CController
{
public $layout = 'header';
public function actionRegister()
{
$model = new RegisterForm();
if(isset($_POST['RegisterForm']))
{
$model->attributes = $_POST['RegisterForm'];
if($model->validate())
{
print 'Work!';
}
}
$this->render('register',array('model'=>$model));
}
}
?>
בואו נוסיף לו עמוד חדש, נקרא לו Login:
protected/controllers/AccountController.php
<?php
class AccountController extends CController
{
public $layout = 'header';
public function actionRegister()
{
$model = new RegisterForm();
if(isset($_POST['RegisterForm']))
{
$model->attributes = $_POST['RegisterForm'];
if($model->validate())
{
print 'Work!';
}
}
$this->render('register',array('model'=>$model));
}
public function actionLogin()
{
$this->render('login',array('model'=>$model));
}
}
?>
class AccountController extends CController
{
public $layout = 'header';
public function actionRegister()
{
$model = new RegisterForm();
if(isset($_POST['RegisterForm']))
{
$model->attributes = $_POST['RegisterForm'];
if($model->validate())
{
print 'Work!';
}
}
$this->render('register',array('model'=>$model));
}
public function actionLogin()
{
$this->render('login',array('model'=>$model));
}
}
?>
לאחר שיצרנו עמוד חדש בשם Login, אנחנו ניצור טופס חדש בשם LoginForm, שבדומה ל RegisterForm, גם הוא מסתיים ב Form.
שם אנו נגדיר תחילה את שדות הטופס, בצורה הבאה:
protected/models/LoginForm.php
<?php
class LoginForm extends CFormModel
{
public $email;
public $password;
}
class LoginForm extends CFormModel
{
public $email;
public $password;
}
פה קבענו ששדות הטופס יהיו אימייל וסיסמה.
(כל משתנה שיצרנו, מגדיר אינפוט מסויים בטופס, חובה להגדיר את השדה כאן, לפני הגדרתו בטופס).
כעת, אנחנו צריכים לקבוע קריטריונים(חוקים) לכל אינפוט בשליחת הטופס, הקריטריונים עוזרים לקבלת מידע נכון ואקטואלי למערכת.
במדריכים הקודמים למדתם איך לקבוע קריטריונים לנתונים הנשלחים מטופס, אנו נחזור ונקבע עכשיו קריטריונים לטופס ההתחברות שלנו:
protected/models/LoginForm.php
<?php
class LoginForm extends CFormModel
{
public $email;
public $password;
public function rules()
{
return array(
array('email, password', 'required', 'message' => 'אחד או יותר מהשדות ריקים'),
array('email', 'email', 'allowEmpty' => false, 'checkMX' => true, 'message' => 'האימייל אינו תקין'),
array('password', 'authenticate')
);
}
}
class LoginForm extends CFormModel
{
public $email;
public $password;
public function rules()
{
return array(
array('email, password', 'required', 'message' => 'אחד או יותר מהשדות ריקים'),
array('email', 'email', 'allowEmpty' => false, 'checkMX' => true, 'message' => 'האימייל אינו תקין'),
array('password', 'authenticate')
);
}
}
קבענו שהאימייל והסיסמה לא יכולים להיות ריקים, האימייל צריך להיות תקין ומלא, והסיסמה דורשת אימות כלשהו.
(בהמשך אנחנו ניצור את האימות לסיסמה ב SQL, ע"י authenticate).
כעת ניצור את הטופס להתחברות:
protected/views/account/login.php
<h1>התחבר</h1>
<?php $form=$this->beginWidget('CActiveForm', array('action' => Yii::app()->createUrl('main/login'))); ?>
<table>
<tr>
<?php echo $form->errorSummary($model); ?>
</tr>
<tr>
<?php echo $form->label($model,'email'); ?>
<?php echo $form->emailField($model,'email'); ?>
</tr>
<tr>
<?php echo $form->label($model,'password'); ?>
<?php echo $form->passwordField($model,'password'); ?>
</tr>
<tr>
<?php echo CHtml::submitButton('Login'); ?>
</tr>
</table>
<?php $this->endWidget(); ?>
<?php $form=$this->beginWidget('CActiveForm', array('action' => Yii::app()->createUrl('main/login'))); ?>
<table>
<tr>
<?php echo $form->errorSummary($model); ?>
</tr>
<tr>
<?php echo $form->label($model,'email'); ?>
<?php echo $form->emailField($model,'email'); ?>
</tr>
<tr>
<?php echo $form->label($model,'password'); ?>
<?php echo $form->passwordField($model,'password'); ?>
</tr>
<tr>
<?php echo CHtml::submitButton('Login'); ?>
</tr>
</table>
<?php $this->endWidget(); ?>
כנאמר למעלה, הטופס בנוי מאימייל וסיסמה, (שימו לב, השתמשתי ב errorSummary, בכדי להציג את כל השגיאות בטופס).
עכשיו, ניצור את האימות של הסיסמה ב SQL, כאן אנחנו נבדוק האם הפרטים של המשתמש, אכן תקינים ורשומים במסד:
protected/models/LoginForm.php
<?php
class LoginForm extends CFormModel
{
public $email;
public $password;
$this->_identity
public function rules()
{
return array(
array('email, password', 'required', 'message' => 'אחד או יותר מהשדות ריקים'),
array('email', 'email', 'allowEmpty' => false, 'checkMX' => true, 'message' => 'האימייל אינו תקין'),
array('password', 'authenticate')
);
}
public function authenticate($attribute,$params)
{
$this->_identity = Account::model()->checkLogin($this->email, $this->password);
if(!$this->_identity)
$this->addError('password', 'שם המשתמש או הסיסמה שגויים');
}
}
class LoginForm extends CFormModel
{
public $email;
public $password;
$this->_identity
public function rules()
{
return array(
array('email, password', 'required', 'message' => 'אחד או יותר מהשדות ריקים'),
array('email', 'email', 'allowEmpty' => false, 'checkMX' => true, 'message' => 'האימייל אינו תקין'),
array('password', 'authenticate')
);
}
public function authenticate($attribute,$params)
{
$this->_identity = Account::model()->checkLogin($this->email, $this->password);
if(!$this->_identity)
$this->addError('password', 'שם המשתמש או הסיסמה שגויים');
}
}
במדריכים הקודמים לא הסברנו למה המשתנה $_identity משמש, עכשיו אני אסביר;
המשתנה $_identity משמש להכנסת פונקציה(ממודל כלשהו), שבעצם בודקת את השדה בטופס שלנו.
במקרה שלנו, הגדרנו שהפונקציה checkLogin במודל Account תחזיר לנו את נתוני הבדיקה במסד, (שימו לב, הפונקציה חייבת להכיל את האימייל והסיסמה, בכדי שתוכל לבדוק אותם במסד);
לאחר מכן, בדקנו האם הערך שחוזר מהפונקציה checkLogin שבמודל Account הוא שלילי, אם כן, הוא מציג הודעת שגיאה על כך שלא נמצא משתמש עם הפרטים שהו הזין.
-------
כעת, אני רוצה להגדיר Labelים(הטקסטים שכתובים ליד כל אינפוט) בעברית, למדתם איך לעשות זאת במדריכים הקודמים, וככה זה נראה ב LoginForm:
protected/models/LoginForm.php
<?php
class LoginForm extends CFormModel
{
public $email;
public $password;
$this->_identity
public function rules()
{
return array(
array('email, password', 'required', 'message' => 'אחד או יותר מהשדות ריקים'),
array('email', 'email', 'allowEmpty' => false, 'checkMX' => true, 'message' => 'האימייל אינו תקין'),
array('password', 'authenticate')
);
}
public function authenticate($attribute,$params)
{
$this->_identity = Accounts::model()->checkLogin($this->email, $this->password);
if(!$this->_identity)
$this->addError('password', 'שם המשתמש או הסיסמה שגויים');
}
public function attributeLabels()
{
return array
(
'email' => 'אימייל',
'password' => 'סיסמה'
);
}
}
class LoginForm extends CFormModel
{
public $email;
public $password;
$this->_identity
public function rules()
{
return array(
array('email, password', 'required', 'message' => 'אחד או יותר מהשדות ריקים'),
array('email', 'email', 'allowEmpty' => false, 'checkMX' => true, 'message' => 'האימייל אינו תקין'),
array('password', 'authenticate')
);
}
public function authenticate($attribute,$params)
{
$this->_identity = Accounts::model()->checkLogin($this->email, $this->password);
if(!$this->_identity)
$this->addError('password', 'שם המשתמש או הסיסמה שגויים');
}
public function attributeLabels()
{
return array
(
'email' => 'אימייל',
'password' => 'סיסמה'
);
}
}
Email=אימייל, Password=סיסמה.
אוקיי, עכשיו אנחנו נראה איך אנחנו בודקים את הטופס במודל Account (המודל שלכם לבדיקות מסד מהמדריכים הקודמים):
protected/models/Account.php
<?php
class Account extends CActiveRecord
{
public function tableName()
{
return 'accounts';
}
public function primaryKey()
{
return 'id';
}
public function checkLogin($email, md5($password))
{
$user = $this->findByAttributes(array('email' => $email, 'password' => $password));
if($user===null)
{
return false;
}
else
{
$this->checkLogined($email, $password);
return true;
}
return false;
}
private function checkLogined($email, sha1($password))
{
$cookies = array('ue' => $email, 'up' => $password);
foreach($cookies as $name=>$value)
{
$cookie = new CHttpCookie($name, $value);
$cookie->expire = time()+60*60*48;
Yii::app()->request->cookies[$name] = $cookie;
}
}
}
?>
class Account extends CActiveRecord
{
public function tableName()
{
return 'accounts';
}
public function primaryKey()
{
return 'id';
}
public function checkLogin($email, md5($password))
{
$user = $this->findByAttributes(array('email' => $email, 'password' => $password));
if($user===null)
{
return false;
}
else
{
$this->checkLogined($email, $password);
return true;
}
return false;
}
private function checkLogined($email, sha1($password))
{
$cookies = array('ue' => $email, 'up' => $password);
foreach($cookies as $name=>$value)
{
$cookie = new CHttpCookie($name, $value);
$cookie->expire = time()+60*60*48;
Yii::app()->request->cookies[$name] = $cookie;
}
}
}
?>
אל תבהלו מהקוד, אני אסביר הכל :D
ראשית, בקובץ LoginForm, קבענו שנקבל את נתוני בדיקת ההתחברות מהפונקציה checkLogin שבמודל Account.
כאן במודל Account, יצרנו את הפונקציה checkLogin, וקבענו שהיא תקבל את האימייל והסיסמה(מה ששלחנו עם הפונקציה ב LoginForm);
בפונקציה אנחנו יצרנו משתנה בשם user, שבעצם מחפש במסד שורות עם הנתונים שביקשנו, במידה והוא מוצא, הוא מחזיר ערך חיובי;
במקרה שלנו, אנחנו חיפשנו בתוך מערך שורה שהאימייל והסיסמה שלה שווים לנתונים ששלח המשתמש, לאחר מכן הצבנו תנאי שבודק האם הערך חיובי/שלילי, במידה והערך חיובי, זה אומר שהוא מצא משתמש אשר מתאים לפרטים שהזין המשתמש, במידה ולא, הוא יחזיר את השגיאה שקבענו ב LoginForm.
לאחר שהפונקציה מצאה את הפרטים שהזין המשתמש, היא שולחת אותנו לפונקציה checkLegined, שהיא בעצם מייצאת את כל נתוני ה Cookie, ובעצם קובעת שהמשתמש התחבר.
בהצלחה ;)
תגובות לכתבה:
מדריך מעולה, תודה רבה :)
תודה רבה!, שמח לכתוב ;)